package com.wbc.utils;

import java.util.Random;


/**
 * 验证码 激活码生成
 *
 *
 * @author wangbingchen
 * @Description
 * @create 2021-11-23 14:12
 */
public class SerialNumberUtil {


    //测试
    public static void main(String[] args) {

        //生成一个6位的 全字母 验证码
        System.out.println(SerialNumberUtil.englishVerificationCode());

        //生成一个 8 位的 全数字 验证码
        System.out.println(SerialNumberUtil.numVerificationCode());

    }

    /**
     * 防止实例化
     */
    private SerialNumberUtil(){
        throw new IllegalArgumentException("SerialNumberUtil cannot");
    }

    /**
     * 验证码中不能出现的字母 这里不允许出现 o O l I 根据实际情况调整
     */
    private static String mask = "oOlI";




    /**
     * 示例 自定义
     * 生成一个6位的 全字母 验证码
     * @return JjNNNu
     */
    public static String englishVerificationCode() {
        return SerialNumberUtil.englishVerificationCode(6);
    }

    /**
     * 示例 自定义
     * 生成一个 8 位的 全数字 验证码
     * @return 06774600
     */
    public static String numVerificationCode() {
        return SerialNumberUtil.numVerificationCode(8);
    }


    /**
     * 根据输入的整数 返回对应长度的随机数字
     * @param len
     * @return
     */
    private static String numVerificationCode(int len){
        StringBuilder code = new StringBuilder();
        for (int i = 0; i < len; ++i) {
            Random r = new Random();
            int x = r.nextInt(10);
            code.append(x);
        }
        return code.toString();
    }

    /**
     * 生成 len 位数的 字母 大小随机 当做授权码 englishVerificationCode
     * @param len 6
     * @return  code OHJHFL
     */
    private static String englishVerificationCode(int len){
        StringBuilder code = new StringBuilder();
        for (int i = 0; i < len; ++i) {
            int temp = getTemp();
            char x = (char) (temp < 26 ? temp + 97 : (temp % 26) + 65);
            code.append(x);
        }
        return code.toString();
    }

    /**
     * 获取一个随机字母（这个字母一定不是 mask里的字母）
     * @return
     */
    private static int getTemp() {

        Random r = new Random();
        int temp = r.nextInt(52);

        char x = (char) (temp < 26 ? temp + 97 : (temp % 26) + 65);
        if(mask.indexOf(x) != -1){
            temp = getTemp();
        }
        return temp;
    }
}
